#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdlib.h>

// 使用std命名空间
using namespace std;

// 定义一个函数类型，用来表示可以被信号捕捉到时执行的函数
typedef function<void ()> func;
// 用来存储所有需要在信号捕捉时执行的函数的向量
vector<func> callbacks;

// 全局变量，用于计数
uint64_t count = 0;

/*
 * 显示计数器的当前数值
 */
void showCount()
{
    cout << "final count : " << count << endl;
}

/*
 * 显示日志信息
 */
void showLog()
{
    cout << "这个是日志功能" << endl;
}

/*
 * 记录当前用户
 */
void logUser()
{
    // 使用fork创建一个子进程，然后在子进程中执行who命令
    if(fork() == 0)
    {
        execl("/usr/bin/who", "who", nullptr);
        exit(1); // 如果execl失败，则退出子进程
    }
    // 等待子进程结束
    wait(nullptr);
}

/*
 * 定义信号捕捉处理函数
 * sig: 捕捉到的信号编号
 */
void catchSig(int signum)
{
    // 遍历并执行向量callbacks中的所有函数
    for(auto &f : callbacks)
    {
        f();
    }
    // 1秒后再次触发闹钟
    alarm(1);
}

/*
 * 输出用法信息
 * proc: 程序名
 */
static void Usage(string proc)
{
    cout << "Usage:\r\n\t" << proc << " signumber processid" << endl;
}

int main(int argc, char *argv[])
{
    // 注册SIGALRM信号的捕捉处理函数
    signal(SIGALRM, catchSig);
    // 设定一个1秒后触发的闹钟
    alarm(1);

    // 向callbacks向量中添加需要执行的函数
    callbacks.push_back(showCount);
    callbacks.push_back(showLog);
    callbacks.push_back(logUser);

    // 无限循环，用于计数
    while(true) count++;

    return 0;
}